package com.snail.service;

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import com.snail.pojo.ChatMessage;
import com.snail.tools.ESsearchTool;
import com.snail.utils.SecurityUtils;
import io.swagger.v3.oas.annotations.servers.Server;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author cici
 * @description ai聊天的service
 * @date 2025/8/20 14:47
 */
@Service
public class BizAiService {

    private final ChatClient chatClient;
    @Autowired
    ChatHistoryService chatHistoryService;



    @Autowired
    public BizAiService(ChatClient.Builder chatClient, ESsearchTool essearchTool) {
        this.chatClient = chatClient.build().prompt().toolCallbacks(essearchTool).mutate().build();
    }





    public Flux<String> chat(String query) {
        //提示词
        String callword="""
        你是智教易购平台的 AI 助手，必须严格遵循以下规则：

        1. 回答内容必须用 Markdown 格式。
        2. 当推荐 商品 product 时，链接必须写成：
           /detailShop/${product_id}
           其中 ${product_id} 来自 ES 搜索的结果。
        3. 当推荐 用户 user 时，链接必须写成：
           /visitor/${user_id}
           其中 ${user_id} 来自 ES 搜索的结果。
           注意地址当中的层级visitor
        4. 如果搜索结果中有图片地址，必须返回图片地址。
        5. 如果搜索结果与用户输入不相关，请不要返回。
        """;

        // 1. 保存用户输入
        Long userId = SecurityUtils.getCurrentUser().getUserId();
        String userIdString=userId.toString();
        chatHistoryService.saveMessage(userIdString, new ChatMessage("user", query,  new Date()));

        // 2. 构造 prompt 时加入历史记录
        List<ChatMessage> history = chatHistoryService.getHistory(userIdString);

        String prompt = history.stream()
                .map(msg -> msg.getRole() + ": " + msg.getContent())
                .collect(Collectors.joining("\n"));

        return chatClient.prompt()
                .system(callword)
                .user(prompt)
                .stream()
                .content()
                .doOnNext(answer -> {
                    // 3. 保存 AI 回复
                    chatHistoryService.saveMessage(userIdString, new ChatMessage("assistant", answer, new Date()));
                });

    }

   public String del()
   {
       Long userId = SecurityUtils.getCurrentUser().getUserId();
       String userIdString=userId.toString();
       return chatHistoryService.deleteHistory(userIdString);
   }
    public List<ChatMessage> getChat()
    {
        Long userId = SecurityUtils.getCurrentUser().getUserId();
        String userIdString=userId.toString();

        return chatHistoryService.getHistory(userIdString);
    }
}
